home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * OSLClassWindow.c
- *
- ****************************************************************************/
-
- #include "OSLClassWindow.h"
- #include "WindowUtils.h"
-
- #include "AppleEvent.h"
-
- #include "Documents.h"
- #include "DocumentHelpers.h"
- #include "DocumentADT.h"
-
- #include "OSLHelpers.h"
- #include "AERCoreSuite.h"
-
- #include "Assertion.h"
-
- // ----------------------------------------------------------------------------
- // Core Suite Object Event handlers
- // ----------------------------------------------------------------------------
-
- static OSErr HandleClose (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleCount (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleDataSize (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleDelete (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleDuplicate (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleExists (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleGetData (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleMake (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleMove (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleOpen (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandlePrint (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleQuit (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleSave (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
- static OSErr HandleSetData (AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply);
-
- // ----------------------------------------------------------------------------
- // Core Suite Object Accessor functions
- // ----------------------------------------------------------------------------
-
- static pascal OSErr
- WindowFromApplicationAccessor(
- DescType desiredClass,
- const AEDesc* containerToken,
- DescType containerClass,
- DescType keyForm,
- const AEDesc* keyData,
- AEDesc* resultToken,
- long refCon);
-
- static OSErr
- PropertyFromListAccessor(
- DescType desiredClass,
- const AEDesc* containerToken,
- DescType containerClass,
- DescType keyForm,
- const AEDesc* keyData,
- AEDesc* resultToken,
- long refCon);
-
- static OSErr
- PropertyFromObjectAccessor(
- DescType desiredClass,
- const AEDesc* containerToken,
- DescType containerClass,
- DescType keyForm,
- const AEDesc* keyData,
- AEDesc* resultToken,
- long refCon);
-
- static OSErr GetDataFromObject (AEDesc *token, AEDesc *desiredTypes, AEDesc *data);
- static OSErr GetDataFromList (AEDesc *srcList, AEDesc *desiredTypes, AEDesc *dstList);
-
- static OSErr SetDataForList (AEDesc *token, AEDesc *data);
- static OSErr SetDataForObject (AEDesc *token, AEDesc *data);
-
-
- static Boolean CanGetProperty (DescType property);
- static Boolean CanSetProperty (DescType property);
- static OSErr SetProperties (WindowPtr window, AEDesc *propertyRecord);
-
- // ----------------------------------------------------------------------------
- // Core Suite Object Accessor helper functions
- // ----------------------------------------------------------------------------
-
- static OSErr DoClose (AEDesc *token, const AEDesc *saving, AEDesc *savingIn);
- static OSErr DoOpen (AEDesc *token);
-
- static OSErr ProcessFormRelativePostition(const AEDesc* anchorToken, const AEDesc *keyData, WindowPtr *window);
-
- /*****************************************************************************
- *
- * WindowEventDispatcher
- *
- * Handles all OSL messages that cDocument should handle
- *
- *****************************************************************************/
-
- OSErr
- WindowEventDispatcher(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply, long refcon)
- {
- #pragma unused (refcon)
-
- OSErr error = noErr;
-
- AEEventID eventID;
- OSType typeCode;
- Size actualSize = 0L;
-
- // Get the event ID
-
- error = AEGetAttributePtr(appleEvent,
- keyEventIDAttr,
- typeType,
- &typeCode,
- (Ptr)&eventID,
- sizeof(eventID),
- &actualSize);
-
- if (error != noErr) {
- return error;
- }
-
- switch (eventID) {
-
- case kAEClone:
- error = HandleDuplicate(token, appleEvent, reply);
- break;
-
- case kAEClose:
- error = HandleClose(token, appleEvent, reply);
- break;
-
- case kAECountElements:
- error = HandleCount(token, appleEvent, reply);
- break;
-
- case kAECreateElement:
- error = HandleMake(token, appleEvent, reply);
- break;
-
- case kAEDelete:
- error = HandleDelete(token, appleEvent, reply);
- break;
-
- case kAEDoObjectsExist:
- error = HandleExists(token, appleEvent, reply);
- break;
-
- case kAEGetData:
- error = HandleGetData(token, appleEvent, reply);
- break;
-
- case kAEGetDataSize:
- error = HandleDataSize(token, appleEvent, reply);
- break;
-
- case kAEMove:
- error = HandleMove(token, appleEvent, reply);
- break;
-
- case kAEOpen:
- error = HandleOpen(token, appleEvent, reply);
- break;
-
- case kAEPrint:
- error = HandlePrint(token, appleEvent, reply);
- break;
-
- case kAEQuitApplication:
- error = HandleQuit(token, appleEvent, reply);
- break;
-
- case kAESave:
- error = HandleSave(token, appleEvent, reply);
- break;
-
- case kAESetData:
- error = HandleSetData(token, appleEvent, reply);
- break;
-
- default:
- error = errAEEventNotHandled;
- break;
- }
-
- return error;
- }
-
- #pragma mark -
- // ----------------------------------------------------------------------------
- // Core Suite Object Event handlers
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleClose(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (reply)
-
- OSErr error = noErr;
-
- DescType typeCode = 0L;
-
- AEDesc saving = {typeNull, nil};
- AEDesc savingIn = {typeNull, nil};
-
- AEDesc *ptrToSaving = NULL;
- AEDesc *ptrToSavingIn = NULL;
-
- // Extract the [saving yes/no/ask] optional parameter, if present
-
- error = AEGetParamDesc(appleEvent, keyAESaveOptions, typeWildCard, &saving);
-
- if (error == noErr)
- ptrToSaving = &saving;
- else if (error == errAEDescNotFound)
- error = noErr;
- else
- goto Cleanup;
-
- // Extract the [saving in <alias>] optional parameter, if present
-
- error = AEGetParamDesc(appleEvent, keyAEFile, typeFSS, &savingIn);
-
- if (error == noErr)
- ptrToSavingIn = &savingIn;
- else if (error == errAEDescNotFound)
- error = noErr;
- else
- goto Cleanup;
-
- // Check for any required parameters we may have missed
-
- error = CheckForUnusedParameters(appleEvent);
- if (error != noErr)
- goto Cleanup;
-
- // Now, do the application-related work
-
- if (TokenContainsTokenList(token))
- {
- AEDesc windowToken = {typeNull, nil};
- long numItems;
- long itemNum;
- AEKeyword keyword;
-
- if (error == noErr)
- {
- error = AECountItems(token, &numItems);
- if (error == noErr || numItems > 0)
- {
- for (itemNum = 1; itemNum <= numItems; itemNum++)
- {
- error = AEGetNthDesc(token, itemNum, typeWildCard, &keyword, &windowToken);
-
- if (error == noErr)
- error = DoClose(&windowToken, ptrToSaving, ptrToSavingIn);
- else
- break;
-
- AEDisposeDesc(&windowToken);
- }
- }
- }
- AEDisposeDesc(&windowToken);
- }
- else
- {
- error = DoClose(token, ptrToSaving, ptrToSavingIn);
- }
-
- Cleanup:
-
- AEDisposeDesc(&saving);
- AEDisposeDesc(&savingIn);
-
- return error;
-
- }
-
- // ----------------------------------------------------------------------------
- // Count things IN a window, not count windows
- // Not implement. Count things in documents, not windows, in this implementation.
-
- static OSErr
- HandleCount(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
-
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleDataSize(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleDelete(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleDuplicate(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
- // If <anObject> exists...
- // The AEResolve() function in AERCoreSuite.c will already have filtered
- // out all cases where the object did not exist, so this function should
- // always return TRUE.
-
- static OSErr
- HandleExists(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent)
-
- OSErr error = noErr;
- Boolean foundIt = true;
-
- error = AEPutParamPtr(reply,
- keyAEResult,
- typeBoolean,
- (Ptr)&foundIt,
- sizeof(Boolean));
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleGetData(AEDesc *tokenOrTokenList, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- OSErr error = noErr;
- AEDesc data = {typeNull, nil};
- AEDesc desiredTypes = {typeNull, nil};
-
- AEGetParamDesc(appleEvent, keyAERequestedType, typeAEList, &desiredTypes);
-
- error = GetDataFromWindow(tokenOrTokenList, &desiredTypes, &data);
-
- if (error == noErr && reply->descriptorType != typeNull)
- error = AEPutKeyDesc(reply, keyDirectObject, &data);
-
- AEDisposeDesc(&data);
- AEDisposeDesc(&desiredTypes);
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleMake(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleMove(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleOpen(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (reply)
-
- OSErr error = noErr;
-
- DescType typeCode = 0L;
-
- // Check for any required parameters we may have missed
-
- error = CheckForUnusedParameters(appleEvent);
- if (error != noErr)
- goto Cleanup;
-
- // Now, do the application-related work
-
- if (TokenContainsTokenList(token))
- {
- AEDescList flatList = {typeNull, nil};
- AEDesc singleToken = {typeNull, nil};
- long numItems;
- long itemNum;
- AEKeyword keyword;
-
- error = AECreateList(NULL, 0L, false, &flatList);
- if (error == noErr)
- {
- error = AECountItems(&flatList, &numItems);
- if (error == noErr || numItems > 0)
- {
- for (itemNum = 1; itemNum <= numItems; itemNum++)
- {
- error = AEGetNthDesc(&flatList, itemNum, typeWildCard, &keyword, &singleToken);
-
- if (error == noErr)
- error = DoOpen(&singleToken);
- else
- break;
-
- AEDisposeDesc(&singleToken);
- }
- }
- }
-
- AEDisposeDesc(&flatList);
- AEDisposeDesc(&singleToken);
- }
- else
- {
- error = DoOpen(token);
- }
-
- Cleanup:
-
- return error;
-
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandlePrint(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleQuit(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleSave(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (token, appleEvent, reply)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- // ----------------------------------------------------------------------------
-
- static OSErr
- HandleSetData(AEDesc *token, const AppleEvent *appleEvent, AppleEvent *reply)
- {
- #pragma unused (reply)
-
- OSErr error = noErr;
- AEDesc data = {typeNull, nil};
-
- DescType propertyCode;
- DescType objectClass;
-
- switch (token->descriptorType)
- {
- case typeAEList:
- error = ExtractKeyDataParameter(appleEvent, &data);
- if (error == noErr)
- error = SetDataForList(token, &data);
- break;
-
- case cProperty:
- propertyCode = ExtractPropertyCodeFromToken(token);
- objectClass = ExtractObjectClassFromToken(token);
- if (CanSetProperty(propertyCode))
- {
- error = ExtractKeyDataParameter(appleEvent, &data);
- if (error == noErr)
- error = SetDataForObject(token, &data);
- }
- else
- {
- error = errAENotModifiable;
- }
- break;
-
- default:
- error = errAENotModifiable;
- break;
- }
-
- AEDisposeDesc(&data);
-
- return error;
- }
-
- #pragma mark -
- // -----------------------------------------------------------------------------
- // Object Accessors
- //------------------------------------------------------------------------------
-
- OSErr
- InstallWindowAccessors(void)
- {
- OSErr error;
-
- error = AEInstallObjectAccessor(cWindow, typeNull, NewOSLAccessorProc(WindowFromApplicationAccessor), 0L, false);
-
- // although windows can't contain other window,
- // we need this accessor to support formRelativePostion,
- // which sends us one window as a "container" and asks us to find
- // either the window before or after that window
-
- if (error == noErr)
- error = AEInstallObjectAccessor(cWindow, cWindow, NewOSLAccessorProc(WindowFromApplicationAccessor), 0L, false);
-
- if (error == noErr)
- error = AEInstallObjectAccessor(cProperty, cWindow, NewOSLAccessorProc(PropertyFromWindowAccessor), 0L, false);
-
- return error;
- }
-
- #pragma mark -
- //------------------------------------------------------------------------------
- // Retrieve the window from the application container by the key form and return its
- // pointer in the dataHandle field of resultToken.
- //------------------------------------------------------------------------------
-
- static pascal OSErr
- WindowFromApplicationAccessor(
- DescType desiredClass, // cWindow
- const AEDesc* containerToken, // null container
- DescType containerClass, // cApplication
- DescType keyForm,
- const AEDesc* keyData,
- AEDesc* resultToken, // specified window is returned in result
- long refCon)
- {
- #pragma unused (containerToken, containerClass, refCon)
-
- OSErr error = noErr;
- WindowPtr window;
-
- Str255 title;
-
- DescType keyDataType = keyData->descriptorType;
- long index;
- long numWindows;
-
- Boolean wantsAllItems = false;
-
- AEDesc startObject = {typeNull, nil}; // These are used to resolve formRange
- AEDesc stopObject = {typeNull, nil};
-
- CoreTokenRecord token;
- InitCoreTokenRecord(&token);
-
- numWindows = CountWindows();
-
- switch (keyForm) {
- case formName: // window by name
- if (DescToPString(keyData, title, 255) != noErr)
- {
- error = errAECoercionFail;
- }
- else
- {
- window = GetWindowByTitle(title);
- if (window == nil)
- error = errAENoSuchObject;
- }
-
- break;
-
- case formAbsolutePosition: // window by number
- error = NormalizeAbsoluteIndex(keyData, &index, numWindows, &wantsAllItems);
- if ((error == noErr) && (wantsAllItems == false))
- {
- window = GetWindowByIndex(index);
- if (window == nil)
- error = errAEIllegalIndex;
- }
- break;
-
- case formRelativePosition:
- error = ProcessFormRelativePostition(containerToken, keyData, &window);
- break;
-
- case formRange:
- switch (keyDataType)
- {
- case typeRangeDescriptor:
- error = ProcessFormRange((AEDesc *)keyData, &startObject, &stopObject);
- if (error == noErr)
- {
- DescType startType = ExtractDispatchClassFromToken(&startObject);
- DescType stopType = ExtractDispatchClassFromToken(&stopObject);
-
- if (startType != cWindow || stopType != cWindow)
- error = errAEWrongDataType;
- }
- break;
-
- default:
- error = errAEWrongDataType;
- break;
- }
- break;
-
- default:
- return errAEEventNotHandled;
- }
-
- // if user asked for all items, and there aren't any,
- // we'll be kind and return an empty list.
-
- if (wantsAllItems && (error == errAENoSuchObject || error == errAEIllegalIndex))
- {
- error = AECreateList(NULL, 0, false, (AEDescList*)resultToken);
- goto CleanUp;
- }
-
- // fill in the result token
-
- if (error == noErr)
- {
- token.dispatchClass = cWindow;
- token.objectClass = cWindow;
- token.propertyCode = typeNull;
-
- if (wantsAllItems)
- {
- error = AECreateList(NULL, 0, false, (AEDescList*)resultToken);
-
- if (error == noErr)
- {
- for (index = 1; index <= numWindows; index++)
- {
- window = GetWindowByIndex(index);
- if (window == nil)
- goto CleanUp;
-
- token.window = window;
-
- error = AEPutPtr(resultToken, 0, desiredClass, &token, sizeof(token));
- if (error != noErr)
- goto CleanUp;
- }
- }
- }
- else if (keyForm == formRange)
- {
- WindowPtr beginWindow;
- WindowPtr endWindow;
-
- long beginIndex;
- long endIndex;
-
- beginWindow = ExtractWindowPtrFromToken(&startObject);
- beginIndex = GetWindowIndex(beginWindow);
-
- endWindow = ExtractWindowPtrFromToken(&stopObject);
- endIndex = GetWindowIndex(endWindow);
-
- error = AECreateList(NULL, 0, false, (AEDescList*)resultToken);
- if (error != noErr)
- goto CleanUp;
-
- if (beginIndex > endIndex) // swap elements
- {
- WindowPtr temp;
-
- temp = beginWindow;
- beginWindow = endWindow;
- endWindow = temp;
- }
-
- window = beginWindow;
- while (window != nil)
- {
- token.window = window;
-
- error = AEPutPtr(resultToken, 0, desiredClass, &token, sizeof(token));
- if (error != noErr)
- goto CleanUp;
-
- if (window == endWindow)
- break;
- window = GetNextWindow(window);
- }
- }
- else
- {
- token.window = window;
- error = AECreateDesc(desiredClass, &token, sizeof(token), resultToken);
- }
- }
-
- CleanUp:
-
- AEDisposeDesc(&startObject);
- AEDisposeDesc(&stopObject);
-
- return error;
- }
-
- #pragma mark -
- //----------------------------------------------------------------------------------
- // Window Property Accessor
- //----------------------------------------------------------------------------------
- // Handles properties from window token or list of window tokens
- //
- // NOTE: The container can be either a single token, or a list of tokens
- //
- //----------------------------------------------------------------------------------
-
- pascal OSErr
- PropertyFromWindowAccessor(
- DescType desiredClass,
- const AEDesc* containerToken,
- DescType containerClass,
- DescType keyForm,
- const AEDesc* keyData,
- AEDesc* resultToken,
- long refCon)
- {
- OSErr error = noErr;
-
- if (TokenContainsTokenList((AEDescList*)containerToken) == false)
- {
- error = PropertyFromObjectAccessor(desiredClass, containerToken, containerClass, keyForm, keyData, resultToken, refCon);
- }
- else
- {
- error = AECreateList(NULL, 0L, false, resultToken);
- if (error == noErr)
- error = PropertyFromListAccessor(desiredClass, containerToken, containerClass, keyForm, keyData, resultToken, refCon);
- }
-
- return error;
- }
-
- //----------------------------------------------------------------------------------
-
- static OSErr
- PropertyFromListAccessor(
- DescType desiredClass,
- const AEDesc* containerToken,
- DescType containerClass,
- DescType keyForm,
- const AEDesc* keyData,
- AEDesc* resultToken,
- long refCon)
- {
- OSErr error = noErr;
- long itemNum;
- long numItems;
- DescType keyword;
- AEDesc srcItem = {typeNull, nil};
- AEDesc dstItem = {typeNull, nil};
-
- error = AECountItems((AEDescList*)containerToken, &numItems);
- if (error != noErr)
- goto CleanUp;
-
- for (itemNum = 1; itemNum <= numItems; itemNum++)
- {
- error = AEGetNthDesc(containerToken, itemNum, typeWildCard, &keyword, &srcItem);
- if (error != noErr)
- goto CleanUp;
-
- if (TokenContainsTokenList(&srcItem) == false)
- {
- error = PropertyFromObjectAccessor(desiredClass, &srcItem, containerClass, keyForm, keyData, &dstItem, refCon);
- }
- else
- {
- error = AECreateList(NULL, 0L, false, &dstItem);
- if (error == noErr)
- error = PropertyFromListAccessor(desiredClass, &srcItem, containerClass, keyForm, keyData, &dstItem, refCon);
- }
-
- if (error != noErr)
- goto CleanUp;
-
- error = AEPutDesc(resultToken, itemNum, &dstItem);
- if (error != noErr)
- goto CleanUp;
-
- AEDisposeDesc(&srcItem);
- AEDisposeDesc(&dstItem);
- }
-
- CleanUp:
-
- AEDisposeDesc(&srcItem);
- AEDisposeDesc(&dstItem);
-
- return error;
- }
-
- //----------------------------------------------------------------------------------
- // Return a token representing the property for the containing window.
- // The token is returned with the property and window reference.
- //----------------------------------------------------------------------------------
-
- static OSErr
- PropertyFromObjectAccessor(
- DescType desiredType, // cProperty
- const AEDesc* containerToken, // Window object token
- DescType containerClass, // cWindow
- DescType keyForm, // formPropertyID
- const AEDesc* keyData,
- AEDesc* resultToken,
- long refCon )
- {
- #pragma unused (containerClass, keyForm, refCon)
-
- OSErr error;
- DescType requestedProperty;
-
- error = AEDuplicateDesc(containerToken, resultToken);
- if (error != noErr)
- return error;
-
- requestedProperty = **(DescType**)(keyData->dataHandle);
-
- if (requestedProperty == kAEAll)
- requestedProperty = pProperties;
-
- if (CanGetProperty(requestedProperty) || CanSetProperty(requestedProperty))
- {
- resultToken->descriptorType = desiredType;
- (**(CoreTokenHandle)(resultToken->dataHandle)).propertyCode = requestedProperty;
- }
- else
- {
- error = errAEEventNotHandled;
- }
-
- return error;
- }
-
- #pragma mark -
-
- // -------------------------------------------------------------------------------------------
- //
- // GetDataFromWindow
- //
- // Given a token that contains information about a window object, access the object
- // to extract the relevant data, and return it to the caller in the "data" parameter.
- //
- // PUBLIC: also called from the ObjectComparison callback function
- //
- // The first parameter contains either a single token or a list of tokens
- // The second parameter is NULL or a list of preferred types for the return data
- //
- // -------------------------------------------------------------------------------------------
-
- OSErr
- GetDataFromWindow(AEDesc *tokenOrTokenList, AEDesc *desiredTypes, AEDesc *data)
- {
- OSErr error = noErr;
-
- if (TokenContainsTokenList(tokenOrTokenList) == false)
- {
- error = GetDataFromObject(tokenOrTokenList, desiredTypes, data);
- }
- else
- {
- error = AECreateList(NULL, 0L, false, data);
- if (error == noErr)
- error = GetDataFromList(tokenOrTokenList, desiredTypes, data);
- }
-
- return error;
- }
-
- // -------------------------------------------------------------------------------------------
- //
- // GetDataFromList
- //
- // -------------------------------------------------------------------------------------------
-
- static OSErr
- GetDataFromList(AEDesc *srcList, AEDesc *desiredTypes, AEDesc *dstList)
- {
- OSErr error = noErr;
- long itemNum;
- long numItems;
- DescType keyword;
- AEDesc srcItem = {typeNull, nil};
- AEDesc dstItem = {typeNull, nil};
-
- error = AECountItems((AEDescList*)srcList, &numItems);
- if (error != noErr)
- goto CleanUp;
-
- for (itemNum = 1; itemNum <= numItems; itemNum++)
- {
- error = AEGetNthDesc(srcList, itemNum, typeWildCard, &keyword, &srcItem);
- if (error != noErr)
- goto CleanUp;
-
- if (TokenContainsTokenList(&srcItem) == false)
- {
- error = GetDataFromObject(&srcItem, desiredTypes, &dstItem); // Get data from single item
- }
- else
- {
- error = AECreateList(NULL, 0L, false, &dstItem);
- if (error == noErr)
- error = GetDataFromList(&srcItem, desiredTypes, &dstItem);
- }
- if (error != noErr)
- goto CleanUp;
-
- error = AEPutDesc(dstList, itemNum, &dstItem);
- if (error != noErr)
- goto CleanUp;
-
- AEDisposeDesc(&srcItem);
- AEDisposeDesc(&dstItem);
- }
-
- CleanUp:
-
- AEDisposeDesc(&srcItem);
- AEDisposeDesc(&dstItem);
-
- return error;
- }
-
- //----------------------------------------------------------------------------------
- // GetDataFromObject
- //
- // Extract the window reference from a token and then return the property the user requested
- //
- //----------------------------------------------------------------------------------
-
- static OSErr
- GetDataFromObject(AEDesc *token, AEDesc *desiredTypes, AEDesc *data)
- {
- #pragma unused (desiredTypes)
-
- OSErr error = noErr;
- Boolean usePropertyCode = false;
- WindowPtr window;
- WindowPtr tempWindow;
-
- DescType aType = cWindow;
- Rect aRect;
-
- Point aPoint;
- Boolean aBoolean;
- long index;
- Str255 windowTitle;
-
- usePropertyCode = ExtractUsePropertyCodeFromToken(token);
- window = ExtractWindowPtrFromToken(token);
-
- GetWTitle((WindowPtr)window, windowTitle);
-
- // compute this window's index from front
-
- tempWindow = GetFirstWindow();
- index = 1L;
-
- while (tempWindow != nil && window != tempWindow)
- {
- index++;
- tempWindow = (WindowPtr)GetNextWindow(tempWindow);
- }
-
- if (usePropertyCode == false)
- {
- error = errAECantSupplyType;
- }
- else
- {
- DescType propertyCode = ExtractPropertyCodeFromToken(token);
-
- switch (propertyCode)
- {
- case pProperties:
- error = AECreateList(NULL, 0L, true, data);
- if (error != noErr)
- goto CleanUp;
-
- error = AEPutKeyPtr(data, pObjectType, typeType, &aType, sizeof(DescType));
-
- error = AEPutKeyPtr(data, pTitle, typeChar, &windowTitle[1], windowTitle[0]);
- error = AEPutKeyPtr(data, pIndex, typeLongInteger, &index, sizeof(long));
-
- GetWindowBounds(window, &aRect);
- error = AEPutKeyPtr(data, pBounds, typeQDRectangle, &aRect, sizeof(Rect));
- aPoint.h = aRect.left;
- aPoint.v = aRect.top;
- error = AEPutKeyPtr(data, pLocation, typeQDPoint, &aPoint, sizeof(Point));
-
- aBoolean = WindowHasCloseBox(window);
- error = AEPutKeyPtr(data, pHasCloseBox, typeBoolean, &aBoolean, sizeof(Boolean));
-
- aBoolean = (WindowHasCloseBox(window) || WindowHasZoomBox(window));
- error = AEPutKeyPtr(data, pHasTitleBar, typeBoolean, &aBoolean, sizeof(Boolean));
-
- aBoolean = WindowIsModal(window);
- error = AEPutKeyPtr(data, pIsModal, typeBoolean, &aBoolean, sizeof(Boolean));
-
- aBoolean = (WindowHasZoomBox(window) || WindowHasGrowIcon(window));
- error = AEPutKeyPtr(data, pIsResizable, typeBoolean, &aBoolean, sizeof(Boolean));
-
- aBoolean = WindowHasZoomBox(window);
- error = AEPutKeyPtr(data, pIsZoomable, typeBoolean, &aBoolean, sizeof(Boolean));
-
- aBoolean = WindowHasZoomBox(window);
- error = AEPutKeyPtr(data, pIsZoomed, typeBoolean, &aBoolean, sizeof(Boolean));
-
- aBoolean = WindowIsModeless(window);
- error = AEPutKeyPtr(data, pIsModeless, typeBoolean, &aBoolean, sizeof(Boolean));
-
- aBoolean = WindowIsMovableModal(window);
- error = AEPutKeyPtr(data, pIsMovableModal, typeBoolean, &aBoolean, sizeof(Boolean));
-
- aBoolean = ((WindowPeek)window)->visible;
- error = AEPutKeyPtr(data, pVisible, typeBoolean, &aBoolean, sizeof(Boolean));
-
- break;
-
- case pBestType:
- case pClass:
- case pDefaultType:
- case pObjectType:
- error = AECreateDesc(typeType, &aType, sizeof(DescType), data);
- break;
-
- case pBounds:
- GetWindowBounds(window, &aRect);
- error = AECreateDesc(typeQDRectangle, &aRect, sizeof(Rect), data);
- break;
-
- case pLocation:
- GetWindowBounds(window, &aRect);
- aPoint.h = aRect.left;
- aPoint.v = aRect.top;
- error = AECreateDesc(typeQDPoint, &aPoint, sizeof(Point), data);
- break;
-
- case pIsModeless:
- aBoolean = WindowIsModeless(window);
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pIsMovableModal:
- aBoolean = WindowIsMovableModal(window);
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pHasCloseBox:
- aBoolean = WindowHasCloseBox(window);
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pHasTitleBar:
- aBoolean = (WindowHasCloseBox(window) || WindowHasZoomBox(window));
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pIndex:
- error = AECreateDesc(typeLongInteger, &index, sizeof(long), data);
- break;
-
- case pIsModal:
- aBoolean = WindowIsModal(window);
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pIsResizable:
- aBoolean = (WindowHasZoomBox(window) || WindowHasGrowIcon(window));
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pIsZoomable:
- aBoolean = WindowHasZoomBox(window);
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pIsZoomed:
- aBoolean = WindowHasZoomBox(window);
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pVisible:
- aBoolean = WindowIsVisible(window);
- error = AECreateDesc(typeBoolean, &aBoolean, sizeof(Boolean), data);
- break;
-
- case pName: // Synonym for pTitle
- case pTitle:
- error = AECreateDesc(typeChar, &windowTitle[1], windowTitle[0], data);
- break;
-
- deafult:
- error = errAECantSupplyType;
- }
- }
-
- CleanUp:
-
- return error;
- }
-
- #pragma mark -
- // -------------------------------------------------------------------------------------------
- //
- // SetDataFromWindowTokenList
- //
- // Given a token that contains a list of cWindow tokens,
- // walk the list recursively to set the data for each token in the list
- //
- // -------------------------------------------------------------------------------------------
-
- static OSErr
- SetDataForList(AEDesc *token, AEDesc *data)
- {
- OSErr error = noErr;
- AEDesc tempToken = {typeNull, nil};
-
- long numItems;
- long itemNum;
- AEKeyword keyword;
-
- if (TokenContainsTokenList(token) == false)
- {
- error = SetDataForObject(token, data);
- }
- else
- {
- error = AECountItems((AEDescList*)token, &numItems);
- if (error != noErr)
- goto CleanUp;
-
- for (itemNum = 1; itemNum <= numItems; itemNum++)
- {
- error = AEGetNthDesc((AEDescList*)token, itemNum, typeWildCard, &keyword, &tempToken);
- if (error != noErr)
- goto CleanUp;
-
- if (TokenContainsTokenList(&tempToken) == false)
- {
- error = SetDataForObject(&tempToken, data); // Set data from single item
- }
- else
- {
- error = SetDataForList(&tempToken, data); // Recurse sublist
- }
- if (error != noErr)
- goto CleanUp;
-
- AEDisposeDesc(&tempToken);
- }
- }
-
- CleanUp:
-
- AEDisposeDesc(&tempToken);
-
- return error;
- }
-
- //----------------------------------------------------------------------------------
- //
- // SetDataForToken()
- //
- //----------------------------------------------------------------------------------
- // Assumption: HandleSetData() has already filtered out all attempts
- // to write to a read-only property.
-
- // Extract the document reference from a token, get its ad reference,
- // and then store the data we received into the requested property
-
- static OSErr
- SetDataForObject(AEDesc *token, AEDesc *data)
- {
-
- OSErr error = noErr;
-
- Boolean usePropertyCode;
- DescType propertyCode;
- WindowPtr window = nil;
-
- AEDesc propertyRecord = {typeNull, nil};
-
- usePropertyCode = ExtractUsePropertyCodeFromToken(token);
-
- window = ExtractWindowPtrFromToken(token);
-
- if (usePropertyCode == false)
- {
- error = errAEWriteDenied;
- }
- else
- {
- propertyCode = ExtractPropertyCodeFromToken(token);
-
- // Convert the single property to a record containing one property
-
- if (data->descriptorType == typeAERecord)
- {
- error = SetProperties(window, data);
- }
- else // Build a record with one property
- {
- error = AECreateList(NULL, 0L, true, &propertyRecord);
- if (error != noErr)
- goto CleanUp;
-
- error = AEPutKeyDesc(&propertyRecord, propertyCode, data);
- if (error != noErr)
- goto CleanUp;
-
- error = SetProperties(window, &propertyRecord);
- }
- }
-
- CleanUp:
-
- AEDisposeDesc(&propertyRecord);
-
- return error;
- }
-
-
- //----------------------------------------------------------------------------------
- // SetProperties
- //----------------------------------------------------------------------------------
- // Set an object's properties from the record we receive
-
- static OSErr
- SetProperties(WindowPtr window, AEDesc *propertyRecord)
- {
- #pragma unused (window)
-
- OSErr error = noErr;
- OSErr ignoreError = noErr;
-
- long numProperties = 0L;
-
- AEDesc data = {typeNull, nil};
-
- GrafPtr curPort;
-
- GetPort(&curPort);
- SetPort(window);
-
- if (propertyRecord == NULL || propertyRecord->descriptorType != typeAERecord)
- {
- error = errAEWrongDataType;
- goto CleanUp;
- }
-
- error = AECountItems(propertyRecord, &numProperties);
-
- if (error != noErr || numProperties <= 0)
- goto CleanUp;
-
- // pBounds
-
- ignoreError = AEGetKeyDesc(propertyRecord, pBounds, typeQDRectangle, &data);
- if (ignoreError != errAEDescNotFound)
- {
- Rect r;
- error = DescToRect(&data, &r);
-
- if (error == noErr)
- {
- short windowWidth = r.right - r.left;
- short windowDepth = r.bottom - r.top;
-
- InvalRect(&window->portRect);
- MoveWindow(window, r.left, r.top, false);
- SizeWindow(window, windowWidth, windowDepth, true);
- InvalRect(&window->portRect);
- }
- AEDisposeDesc(&data);
- }
-
- // pLocation
-
- ignoreError = AEGetKeyDesc(propertyRecord, pLocation, typeQDPoint, &data);
- if (ignoreError != errAEDescNotFound)
- {
- Point p;
- error = DescToPoint(&data, &p);
-
- if (error == noErr)
- MoveWindow(window, p.h, p.v, false); // don't let Window Manager bring it to front!
-
- AEDisposeDesc(&data);
- }
-
- // pIndex
-
- ignoreError = AEGetKeyDesc(propertyRecord, pIndex, typeLongInteger, &data);
- if (ignoreError != errAEDescNotFound)
- {
- long index;
- long numWindows;
- WindowPtr behindWindow;
-
- error = DescToLong(&data, &index);
-
- if (error == noErr)
- {
- numWindows = CountWindows();
- if (index < 0)
- index = numWindows + index + 1;
-
- if (index == 1)
- {
- SelectWindow(window);
- }
- else
- {
- behindWindow = GetWindowByIndex(index);
- if (behindWindow != NULL)
- {
- SendBehind(window, behindWindow);
- }
- else
- {
- error = errAEEventNotHandled;
- }
- }
- }
-
- AEDisposeDesc(&data);
- }
-
-
- // pIsZoomed
-
- ignoreError = AEGetKeyDesc(propertyRecord, pIsZoomed, typeBoolean, &data);
- if (ignoreError != errAEDescNotFound)
- {
- Boolean zoomIt;
-
- error = DescToBoolean(&data, &zoomIt);
-
- if (error == noErr)
- {
- EraseRect(&window->portRect);
-
- if (zoomIt)
- ZoomWindow(window, inZoomOut, false);
- else
- ZoomWindow(window, inZoomIn, false);
-
- InvalRect(&window->portRect);
- }
-
- AEDisposeDesc(&data);
- }
-
- // pVisible
-
- ignoreError = AEGetKeyDesc(propertyRecord, pVisible, typeBoolean, &data);
- if (ignoreError != errAEDescNotFound)
- {
- Boolean showIt;
- error = DescToBoolean(&data, &showIt);
-
- if (error == noErr)
- {
- if (showIt)
- ShowWindow(window);
- else
- HideWindow(window);
- }
-
- AEDisposeDesc(&data);
- }
-
- CleanUp:
-
- SetPort(curPort);
- AEDisposeDesc(&data);
-
- return error;
- }
-
- #pragma mark -
- //----------------------------------------------------------------------------------
-
- static Boolean
- CanGetProperty(DescType property)
- {
- Boolean result = false;
-
- switch (property)
- {
- // Properties we can get:
-
- case pBestType:
- case pClass:
- case pDefaultType:
- case pObjectType:
-
- case pProperties:
-
- case pTitle:
- case pName: // Synonym for pTitle
-
- case pIsModeless:
- case pIsMovableModal:
- case pIsSuspended:
- case pIsPalette:
- case pIsDialog:
-
- case pBounds:
- case pLocation:
-
- case pHasCloseBox:
- case pHasTitleBar:
- case pIndex:
-
- case pIsFloating:
- case pIsModal:
- case pIsResizable:
- case pIsZoomable:
-
- case pIsZoomed:
- case pVisible:
- result = true;
- break;
-
- // Properties we can't get:
- default:
- result = false;
- break;
- }
-
- return result;
- }
-
- //----------------------------------------------------------------------------------
-
- static Boolean
- CanSetProperty(DescType property)
- {
- Boolean result = false;
-
- switch (property)
- {
- // Properties we can set:
-
- case pProperties:
- result = true;
- break;
-
- // Properties that can be set only for certain types of windows:
-
- case pTitle:
- case pName: // Synonym for pTitle
-
- case pBounds:
- case pLocation:
- case pIndex:
- case pVisible:
- case pIsZoomed:
- result = true;
- break;
-
- // Properties we should be able to set, but not implemented yet:
-
-
- // Properties we can't set:
-
- default:
- case pBestType:
- case pClass:
- case pDefaultType:
- case pObjectType:
-
- case pIsModeless:
- case pIsMovableModal:
- case pIsSuspended:
- case pIsPalette:
- case pIsDialog:
-
- case pHasCloseBox:
- case pHasTitleBar:
-
- case pIsFloating:
- case pIsModal:
- case pIsResizable:
- case pIsZoomable:
- result = false;
- break;
- }
-
- return result;
- }
-
- #pragma mark -
- //----------------------------------------------------------------------------------
- // Application-Specific code triggered by a similarly-named HandleXXX()
- //----------------------------------------------------------------------------------
-
- static OSErr
- DoClose(AEDesc *token, const AEDesc *saving, AEDesc *savingIn)
- {
- #pragma unused (token, saving, savingIn)
-
- OSErr error = noErr;
- DocumentReference document;
-
- error = GetDocumentReferenceFromToken(token, &document);
-
- if (error == noErr && document != nil)
- DestroyDocument(document);
- else
- error = errAEEventNotHandled;
-
- return error;
- }
-
- //----------------------------------------------------------------------------------
- // Open a window object
- //----------------------------------------------------------------------------------
-
- static OSErr
- DoOpen(AEDesc *token)
- {
- #pragma unused (token)
-
- OSErr error = errAEEventNotHandled;
-
- return error;
- }
-
- #pragma mark -
- // -------------------------------------------------------------------------------------------
-
- static OSErr
- ProcessFormRelativePostition(const AEDesc* anchorToken, const AEDesc *keyData, WindowPtr *window)
- {
- OSErr error = noErr;
-
- DescType positionEnum;
- WindowPtr anchorWindow;
- WindowPtr relativeWindow = nil;
-
- *window = NULL;
-
- anchorWindow = ExtractWindowPtrFromToken(anchorToken);
-
- if (anchorWindow != NULL)
- {
-
- switch (keyData->descriptorType)
- {
- case typeEnumerated:
- if (DescToDescType((AEDesc*)keyData, &positionEnum) != noErr)
- {
- error = errAECoercionFail;
- }
- else
- {
- switch (positionEnum)
- {
- case kAENext: // get the window behind the anchor
- *window = GetNextWindow(anchorWindow);
- if (*window == NULL)
- error = errAENoSuchObject;
- break;
-
- case kAEPrevious: // get the document in front of the anchor
- *window = GetPreviousWindow(anchorWindow);
- if (*window == NULL)
- error = errAENoSuchObject;
- break;
-
- default:
- error = errAEEventNotHandled;
- break;
- }
- }
- break;
-
- default:
- error = errAECoercionFail;
- break;
- }
- }
-
- return error;
- }
-
- // -------------------------------------------------------------------------------------------
-